//javascript 的 this 总是指向一个对象
//具体是哪个对象是在程序运行时基于函数的执行环境动态绑定的，而非函数被声明时的环境

//作为对象的方法调用
var obj = {
    a :1,
    getA:function () {
        console.log(this === obj);
        console.log(this.a);
    }
}

obj.getA();

//作为普通函数调用
//浏览器环境下运行
/*
window.name = 'globalName';

var getName = function () {
    return this.name;
}

console.log(getName());

var myObject = {
    name:'sven',
    getName:function () {
        return this.name;
    }
}

console.log(myObject.getName());


var getName = myObject.getName;

console.log(getName());
*/
//构造器调用

var MyClass = function () {
    this.name = 'sven';
}

var obj = new MyClass();

console.log(obj.name);

//如果构造器显式的返回了一个object类型的对象，那么此次的运算结果将返回这个对象，而不是this
var MyClass =function () {
    this.name = 'sven';
    return {
        name:'anne'
    };
}

var obj = new MyClass();
console.log(obj.name)//输出anne 而不是 sven

//如果构造器返回的不是一个对象类型的数据，就不会造成这种情况

var MyClass =function () {
    this.name = 'sven';
    return 'anne';
}

var obj = new MyClass();
console.log(obj.name)//输出sven


//Function.prototype.call 和 Function.prototype.apply 调用
//可以动态的改变传入函数的this

var obj = {
    name:'sven',
    getName:function () {
     return this.name;
    }
};

console.log(obj.name);


var obj2 = {
    name:'anne'
};

console.log(obj.getName.call(obj2));
